package tabela;

import java.util.LinkedList;

/*essa thread ira trabalhar junto a outra thread. Ela so ira ser usada caso quisessemos que duas
 *tabelas fossem modificadas uma em funcao da outra. Exemplo: Quando uma linha nova aparece em uma tabela,
 *uma nova linha deve aparecer na outra tabela*/
public class ThreadAtualizaDoisPaineisTabela extends Thread
{
	private PainelTabelaExpoeAtividadesParaOutraTabela tabela1;
	private PainelTabelaExpoeAtividadesParaOutraTabela tabela2;

	public ThreadAtualizaDoisPaineisTabela(PainelTabelaExpoeAtividadesParaOutraTabela tabela1,
												PainelTabelaExpoeAtividadesParaOutraTabela tabela2)
	{
		this.tabela1 = tabela1;
		this.tabela2 = tabela2;
	}
	
	public void run()
	{
		while((this.tabela1 != null & this.tabela1.isVisible() == true) &&
				(this.tabela2 != null & this.tabela2.isVisible() == true))
		{
			boolean novaLinhaCriadaNaTabela1 = this.tabela1.getNovaLinhaFoiCriadaRecentemente();
			boolean novaLinhaCriadaNaTabela2 = this.tabela2.getNovaLinhaFoiCriadaRecentemente();
			LinkedList<Integer> linhasNaTabela1QueForamDeletadas = this.tabela1.getIndicesDasLinhasDaTabelaQueForamDeletadas();
			LinkedList<Integer> linhasNaTabela2QueForamDeletadas = this.tabela2.getIndicesDasLinhasDaTabelaQueForamDeletadas();
			
			if(novaLinhaCriadaNaTabela1 == true)
			{
				//precisamos criar uma nova linha na tabela2
				this.tabela2.criarLinhaDaTabela();
				
				//agora que ja criamos nova linha na tabela2, nao precisamos mais que 
				//a tabela1 nos avise que uma linha foi criada recentemente
				this.tabela1.setNovaLinhaFoiCriadaRecentemente(false);
			}
			else if(novaLinhaCriadaNaTabela2 == true)
			{
				this.tabela1.criarLinhaDaTabela();
				this.tabela2.setNovaLinhaFoiCriadaRecentemente(false);
			}
			else if(linhasNaTabela1QueForamDeletadas.size() > 0)
			{
				//recentemente a tabela1 deletou linhas?Temos de deletar as mesmas linhas na tabela2
				this.tabela2.deletarLinhasDaTabelaAPartirDeIndices(linhasNaTabela1QueForamDeletadas);
				
				//nao precisamos mais informar que linhas foram recentemente deletadas na tabela1
				this.tabela1.setIndicesDasLinhasDaTabelaQueForamDeletadas(new LinkedList<Integer>());
			}
			else if(linhasNaTabela2QueForamDeletadas.size() > 0)
			{
				this.tabela1.deletarLinhasDaTabelaAPartirDeIndices(linhasNaTabela2QueForamDeletadas);
				
				this.tabela2.setIndicesDasLinhasDaTabelaQueForamDeletadas(new LinkedList<Integer>());
			}
			
			try 
			{
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
